package org.wheel.plugins.toolkit.sql.helper;

import cn.hutool.core.util.StrUtil;
import org.wheel.plugins.toolkit.util.ConvertUtil;

import java.lang.reflect.Field;

/**
 * Lambda 解析工具 – 零依赖实现
 */
public final class LambdaUtils {

    /**
     * 提取 SerializedLambda
     */
    public static Class<?> extract(SFunction<?, ?> func) {
//        try {
//            Method writeReplace = func.getClass().getDeclaredMethod("writeReplace");
//            writeReplace.setAccessible(true);
//            return (SerializedLambda) writeReplace.invoke(func);
//        } catch (Exception e) {
//            throw new RuntimeException("提取 Lambda 失败", e);
//        }
        return ConvertUtil.getLambdaClass(func);
    }

    /**
     * 从 Lambda 拿到 Java 属性名
     */
    public static String getFieldName(SFunction<?, ?> lambda) {
        String method = ConvertUtil.convertToFieldName(lambda);
        return StrUtil.lowerFirst(method);
    }

    /**
     * 从 Lambda 拿到数据库列名（下划线）
     */
    public static String getColumn(SFunction<?, ?> lambda) {
        String fieldName = getFieldName(lambda);
        return StrUtil.toUnderlineCase(fieldName);
    }

    /**
     * 核心修正：把 getCapturingClass() 的字符串还原为 Class<?>
     */
    public static Class<?> getCapturingClass(SFunction<?, ?> lambda) {
        return ConvertUtil.getLambdaClass(lambda);
    }

    public static <T> Class<?> getFieldType(Class<T> entityClass, SFunction<T,?> column) {
        String fieldName = getFieldName(column);
        try {
            Field field = entityClass.getDeclaredField(fieldName);
            return field.getType();
        } catch (NoSuchFieldException e) {
            // 如果字段不存在，尝试通过 Lambda 的返回类型推断（可能不准确）
            System.out.println("Warning: Field '" + fieldName + "' not found in class " + entityClass.getName() + ", using Object type.");
            return Object.class; // 或者抛出异常
        }
    }

    /**
     * 当前值的类型
     */
    public static Class<?> getValueType(Object value) {
        return value.getClass();
    }
}